package com.gin.pixiv.api

import com.gin.pixiv.enums.NovelSearchMode
import com.gin.pixiv.enums.PixivOrder
import com.gin.pixiv.enums.SearchMode
import com.gin.pixiv.enums.WorkLang
import com.gin.pixiv.param.NovelLikeParam
import com.gin.pixiv.response.PixivResponse
import com.gin.pixiv.response.bookmark.BookmarkDataBody
import com.gin.pixiv.response.common.DiscoveryBody
import com.gin.pixiv.response.common.FollowLatestBody
import com.gin.pixiv.response.illustration.LikeBody
import com.gin.pixiv.response.novel.NovelDetail
import com.gin.pixiv.response.novel.NovelSearchBody
import com.gin.pixiv.response.novel.SimpleNovel
import com.gin.pixiv.response.recommend.RecommendBody
import com.gin.pixiv.response.recommend.RecommendInitBody
import retrofit2.Call
import retrofit2.http.*

/**
 * 小说作品相关API
 * [GET]：详情、关注作品、收藏状态、发现、推荐作品、搜索、动图数据
 * [POST]： 喜欢
 * @author bx002
 * @since 2024/2/21 17:09
 */
interface NovelApi {
    /**
     * 请求小说详情
     */
    @GET("ajax/novel/{nid}")
    fun getDetail(@Path("nid") nid: Long): Call<PixivResponse<NovelDetail>>

    /**
     * 查询小说的收藏状态
     */
    @GET("ajax/novel/{nid}/bookmarkData")
    fun getBookmarkData(@Path("nid") nid: Long): Call<PixivResponse<BookmarkDataBody>>

    /**
     * 发现作品
     */
    @GET("ajax/discovery/novels")
    fun getDiscovery(
        @Query("sampleNovelId") sampleIllustId: Long? = null,
        @Query("limit") limit: Int = 20,
        @Query("mode") mode: SearchMode? = SearchMode.all,
    ): Call<PixivResponse<DiscoveryBody>>

    /**
     * 获取关注作者最新作品
     */
    @GET("ajax/follow_latest/novel")
    fun getLatest(
        @Query("page") page: Int? = 1,
        @Query("mode") mode: SearchMode? = SearchMode.all,
    ): Call<PixivResponse<FollowLatestBody>>

    /**
     * 搜索绘画
     */
    @GET("ajax/search/novels/{keywords}")
    fun getSearch(
        @Path("keywords")
        keywords: String,
        /**
         * 页码
         */
        @Query("p")
        page: Int? = 1,
        /**
         * 排序模式
         */
        @Query("order") order: PixivOrder? = PixivOrder.date_d,
        /**
         * 模式
         */
        @Query("mode") mode: SearchMode? = SearchMode.all,
        /**
         * 发布时间（起），以东九区为准，格式：yyyy-MM-dd
         */
        @Query("scd") dateStart: String? = null,
        /**
         * 发布时间（止），以东九区为准，格式：yyyy-MM-dd
         */
        @Query("ecd") dateEnd: String? = null,
        /**
         * 如果需要屏蔽AI作品，设置为1
         */
        @Query("ai_type") blockAi: Int? = null,
        /**
         * 正文语言
         */
        @Query("work_lang") workLang: WorkLang? = null,
        /**
         * 匹配模式
         */
        @Query("s_mode") searchMode: NovelSearchMode? = NovelSearchMode.DEFAULT,

        ): Call<PixivResponse<NovelSearchBody>>

    /**
     * 根据一个作品ID推荐其他作品
     */
    @GET("ajax/novel/{nid}/recommend/init")
    fun getRecommendInit(
        @Path("nid") nid: Long,
        @Query("limit") limit: Int? = 20,
    ): Call<PixivResponse<RecommendInitBody<SimpleNovel>>>

    /**
     * 根据多个作品ID推荐其他作品
     */
    @GET("ajax/novel/recommend/novels")
    fun getRecommends(@Query("novelIds[]") nid: Set<Long>): Call<PixivResponse<RecommendBody<SimpleNovel>>>

    @POST("ajax/novels/like")
    fun postLike(@Body novelLikeParam: NovelLikeParam): Call<PixivResponse<LikeBody>>
}